//
//  UserAccountViewModel.swift
//  Sina
//
//  Created by maling  on 15/11/7.
//  Copyright © 2015年 maling . All rights reserved.
//

import Foundation

class UserAccountViewModel {
    
 /// 单例- 解决避免重复从沙盒中 加载 归档文件 提高效率 让access_token便于被访问到
    static let sharedUserAccount = UserAccountViewModel()
    
    //定义一个模型属性
    var userAccount: UserAccount?
    
    //判断是否登录标记
    var userLogin: Bool {
    
        //1. 如果access_token有值 说明 用户已经登录过了
        //2. 如果没有过期说明登录成功
        return userAccount?.access_token != nil && !isExpired
    }
    
    //设置用户头像 URL---(计算性属性)
    var avatarUrl: NSURL {
        
        return NSURL(string: userAccount?.avatar_large ?? "")!
    }
    

    /// 设置没有过期的token,
    var accessToken: String? {
    
        //如果token没有过期返回account.中的token属性
        if !isExpired {
           return userAccount?.access_token
        }
        
        return nil
    }
    
    
    /**  用户账号视图模型--没有父类
    
    模型通常继承自NSObject  可以使用kVC 设置属性 简化对象构造
    如果没有父类 所有的内容都需要从头创建，量级更轻
    
    视图模型的作用： 封装业务逻辑 封装网络处理操作  封装数据缓存  通常没有复杂的属性
    
    */
    
    
    
    //归档路径- 计算性函数（类似于有返回值得函数）
    private var accountPath: String {
    
        //1. 保存路径
        let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last!
        //2.从Xcode7开始 stringByAppendPathComponent 转换为NSString
        // 单纯的as 在 Swift中 大多只有三个地方 会用到桥接
        // 1> String as NSString
        // 2> NSArray as [array]
        // 3> NSDictionary as [String: AnyObject]
        //保存为plist文件 拼接后缀名
        return (path as NSString).stringByAppendingPathComponent("account.plist")
        
    }
    
    // MARK: - 账户是否过期属性
    private var isExpired: Bool {
        
        // 判断用户账户过期日期与当前系统日期 进行比较
        // 自己改写日期 测试逻辑是否正确 创建日期 的时候 如果给定的负数 返回当前日期早得时间
        //下面一行用来测试是否过期
//        userAccount?.expiresDate = NSDate(timeIntervalSinceNow: -3600)
       if userAccount?.expiresDate?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
        //代码执行到此 一定进行比较，没有过期
         return false
        }
        //如果过期返回 true
        return true
    
    }

    
    //解档
    //注意： 因为是视图模型 没有父类 所以不需要调用父类的super.init()
    init() {
          //从沙盒解档数据 回复当前数据
      userAccount = NSKeyedUnarchiver.unarchiveObjectWithFile(accountPath) as? UserAccount

         // 判断token 是否过期，isExpired是true 就表示过期
        if isExpired {
        print("已经过期")
            
            //如果过期 清空解档数据
            userAccount = nil
        }
        
        
//       print(userAccount)
        
    }
    
}

/// 用户账户相关的网络方法
/**
   代码重构步骤
   1. 新方法
   2. 粘贴代码
   3. 根据和上下文调整参数和返回值
   4.移动其他字方法
*/
extension UserAccountViewModel {

    func loadUserAccountToken(code: String, finished:(isSuccessed: Bool) -> ()) {
    
        //4.服务器加载令牌请求，返回数据给客户端（打印出来的）
        NetworkTools.sharedTools.loadAccessToken(code) { (result, error) -> () in
            
            //1》 判断错误
            if error != nil {
                
                print("出错了")
                return
            }
            
            //输出结果 结果里面 就有令牌信息(服务器返回的数据)
            //            print(result)
            self.userAccount = UserAccount(dict: result as! [String: AnyObject])
            //print(account)    //  经过模型返回出数据来（包含令牌）
            
            //调用 输出用户信息
            self.loadUserInfo(self.userAccount!, finished:finished)
            
        }
        
    }
        //加载用户信息
        private func loadUserInfo(account: UserAccount, finished:(isSuccessed: Bool) -> ()) {
            
            //这里面的result是字典 包含着用户的头像 用户昵称等信息
            NetworkTools.sharedTools.loadUserInfo(account.uid!) { (result, error) -> () in
                //判断是否出错
                if error != nil {
                    
                    print("加载用户错出了")
                    
                    //加载出错
                    finished(isSuccessed: false)
                    
                    return
                }
                
                //输出用户的很多信息（包括头像，昵称）
                //            print(result)
                guard let dict = result as? [String: AnyObject] else {
                    
                    print("格式错误")
                    
                    finished(isSuccessed: false)
                    
                    return
                    
                }
                //            //取出字典里面的用户昵称 头像地址url
                // 从网络上面获取的数据保存到字典
                account.screen_name = dict["screen_name"] as? String
                account.avatar_large = dict["avatar_large"] as? String
                
                //打印出来用户头像 昵称信息
                //            print(account)
                
                //            print(dict["screen_name"])
                //            print(dict["avatr_large"])
                
                //保存用户信息
//                account.saveUserAccount()//简化代码重构
                NSKeyedArchiver.archiveRootObject(account, toFile: self.accountPath)
                 print(self.accountPath)
                
                //MARK: --需要完成回调
                finished(isSuccessed: true)
                
            }
        }

        


}


